//
//  STSilentLivenessDetector.h
//  STSilentLivenessDetector
//
//  Created by sluin on 15/12/4.
//  Copyright © 2015年 SenseTime. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
#import "STSilentLivenessDetectorDelegate.h"
#import "STSilentLivenessImage.h"

/// 默认超时时间 10s
extern NSInteger const kSenseIdSilentLivenessDefaultTimeOutDuration;
/// 默认HACK阈值 0.85
extern CGFloat const kSenseIdSilentLivenessDefaultHackThreshold;
/// 默认模糊判断阈值 1.4
extern CGFloat const kSenseIdSilentLivenessDefaultBlurThreshold;
/// 默认暗光判定阈值 1.899
extern CGFloat const kSenseIdSilentLivenessDefaultDarkLightThreshold; //! OCLINT
/// 默认强光判定阈值 4.997
extern CGFloat const kSenseIdSilentLivenessDefaultStrongLightThreshold; //! OCLINT
/// 默认睁眼判定阈值 0.47
extern CGFloat const kSenseIdSilentLivenessDefaultEyeOpenThreshold;

@interface STSilentLivenessDetector : NSObject



/**
 *  初始化方法
 *  @param detectionModelPath          DETECTION 模型资源的路径.
 *  @param alignmentModelPath          ALIGNMENT 模型资源的路径.
 *  @param frameSelectorModelPath      FRAME_SELECTOR 模型资源的路径.
 *  @param antiSpoofingModelPath       ANTI_SPOOFING 模型资源的路径.
 *  @param faceQualityModelPath        FACE_QUALITY 模型资源的路径，如果不需要进行人脸质检，可传入nil.
 *  @param licensePath                 SenseID_Liveness_Silent.lic的路径.
 *  @param delegate                       回调代理
 *  @return 静默活体检测器实例
 */

- (instancetype)initWithDetectionModelPath:(NSString *)detectionModelPath
                        alignmentModelPath:(NSString *)alignmentModelPath
                    frameSelectorModelPath:(NSString *)frameSelectorModelPath
                     antiSpoofingModelPath:(NSString *)antiSpoofingModelPath
                      faceQualityModelPath:(NSString *)faceQualityModelPath
                               licensePath:(NSString *)licensePath
                               setDelegate:(id<STSilentLivenessDetectorDelegate>)delegate;



/**
 设置活体检测中是否进行眉毛的遮挡检测 , 不设置时默认为NO;

 @param enable Yes为开启眉毛检测，No，为关闭眉毛遮挡检测
 */
- (void)setBrowOcclusionEnable:(BOOL)enable;

/// 设置是否对视频帧进行模糊过滤，不设置时默认为YES;
/// @param enable YES，模糊过滤，NO，关闭模糊过滤
/// @param threshold
/// 用于判断模糊的阈值，取值范围为[0,5]，检测结果得分大于该阈值即为模糊，默认阈值为1.4，设置为5时，表示关闭模糊过滤
- (void)setBlurryFilterEnable:(BOOL)enable threshold:(float)threshold;

/// 设置是否对视频帧进行暗光和强光过滤，不设置时默认为YES;
/// @param enable YES，开启暗光和强光过滤，NO，关闭暗光和强光过滤
/// @param darkLightThreshold
/// 用于判断暗光的阈值，取值范围为[0,6]，检测结果得分小于该阈值即为暗光，默认阈值为1.899，设置为0时，表示关闭暗光过滤
/// @param strongLightThreshold
/// 用于判断强光的阈值，取值范围为[0,6]，检测结果得分大于该阈值即为强光，默认阈值为4.997，设置为6时，表示关闭强光过滤
- (void)setIlluminationFilterEnable:(BOOL)enable
                 darkLightThreshold:(float)darkLightThreshold
               strongLightThreshold:(float)strongLightThreshold;

/// 设置是否对视频帧中的人脸睁眼状态进行过滤，不设置时默认为NO;
/// @param enable YES，睁眼过滤，NO，关闭睁眼过滤
/// @param threshold
/// 用于判断睁眼的阈值，取值范围为[0,1]，检测结果得分大于该阈值即为睁眼，默认阈值为0.47，设置为0时，表示关闭睁眼过滤
- (void)setEyeOpenFilterEnable:(BOOL)enable threshold:(float)threshold;

/// 设置是否开启遮挡检测，不设置时默认为YES;
/// @param enable YES，开启遮挡检测，NO，关闭遮挡检测
- (void)setOcclusionEnable:(BOOL)enable;

/// 设置静默活体防hack检测的阈值，需在start之前调用才生效，如果不设置，默认值为0.85
/// @param threshold 防hack检测阈值，取值范围(0.0,1.0]
- (void)setHackThreshold:(float)threshold;

/**
 *  设置静默活体检测的超时时间,如果设置的值不合法时报错:STIDSilentLiveness_E_INVALID_ARGUMENT。
 *
 *  @param duration            每个模块允许的最大检测时间,等于0时为不设置超时时间,默认为10s,单位是秒
 */

- (void)setDetectTimeout:(NSInteger)duration;

/**
 *  静默活体通过条件设置，如果设置的值不合法时报错:STIDSilentLiveness_E_INVALID_ARGUMENT。
 *
 *  @param minDuration                 通过静默活体所需的最小时间, [0~dDuration), 默认为0, 0表示无最小时间限制
 *
 *  @param minFrames                通过静默活体所需的最小帧数, 默认4帧, 0表示无最小帧数限制
 */
- (void)setPassConditionMinDuration:(NSInteger)minDuration minFrames:(NSInteger)minFrames;

/**
 设置人脸远近的判断条件，当参数值不在取值范围内或closeRate不为0且farRate大于closeRate时报错:STIDSilentLiveness_E_INVALID_ARGUMENT。
 @param farRate
 人脸高度/宽度占图像短边的比例，[0.0~1.0]，参数设置越靠近0，代表人脸距离屏幕越远，默认为0.4，如果设置为0，则无过远提示。
 @param closeRate
 人脸高度/宽度占图像短边的比例，[0.0~1.0]，参数设置越靠近1，代表人脸距离屏幕越近，默认为0.8，如果设置为0，则无过近提示。

 */
- (void)setFaceDistanceRateWithFarRate:(CGFloat)farRate closeRate:(CGFloat)closeRate;

/**
 对连续输入帧进行人脸跟踪及活体检测

 @param sampleBuffer           每一帧的图像数据
 @param faceOrientation        人脸的朝向
 @param imagePrepareRect       对准框在图像上的rect
 */
- (void)inputDataWithSampleBuffer:(CMSampleBufferRef)sampleBuffer
                   faceOrientaion:(STIDSilentLivenessFaceOrientaion)faceOrientation
                 imagePrepareRect:(CGRect)imagePrepareRect;

/**
 *  开始检测
 */
- (void)start;

/**
 *  停止检测
 */
- (void)stop;

/**
 获取眉毛遮挡检测开关状态

 @return YES，为开启检测，NO，为关闭检测。
 */

- (BOOL)isBrowOcclusionEnable;

/// 获取模糊过滤的开关状态，YES，为开启过滤，NO，为关闭过滤。
- (BOOL)isBlurryFilterEnable;

/// 获取光照过滤的开关状态，YES，为开启过滤，NO，为关闭过滤。
- (BOOL)isIlluminationFilterEnable;

/// 获取睁眼过滤的开关状态，YES，为开启过滤，NO，为关闭过滤。
- (BOOL)isEyeOpenFilterEnable;

/// 获取遮挡检测的开关状态，YES，开启遮挡检测，NO，关闭遮挡检测.
- (BOOL)isOcclusionEnable;

/// 获取静默活体防hack检测的阈值，小于阈值表示检测结果为真人, 大于阈值表示检测不通过。
/// 当异常调用获取失败时，返回值-1.
- (CGFloat)hackThreshold;

/**
 获取超时时间

 @return 超时时间
 */
- (NSInteger)detectTimeout;

/**
 获取活体通过的最小时间

 @return 最小时间
 */
- (NSInteger)passMinDuration;

/**
 获取活体通过的最小帧数

 @return 最小帧数
 */
- (NSInteger)passMinFrames;

/**
 获取人脸远近条件判断中屏幕最远距离阈值

 @return 最远阈值
 */
- (CGFloat)faceFarRate;

/**
 获取人脸远近条件判断中屏幕最近距离阈值

 @return 最近阈值
 */
- (CGFloat)faceCloseRate;

/**
 *  获取SDK版本
 *
 *  @return SDK版本
 */
+ (NSString *)sdkVersion;

/**
 * 获取底层库版本.
 *
 * @return 底层库版本.
 */
+ (NSString *)libraryVersion;

@end
